# eslint检测/格式化前端代码

import os
import json

# 获取待格式化文件
file_list_str = os.getenv('JIANMU_FILES')
# file_list_str = '["../file/test/test2.js","../file/test/login.vue","../file/test/index.html","../file/test/box.jsx"]'
# file_list_str = 'C:/Users/86152/Desktop/eslint_check/file/test/*'

# 待检测/格式化的文件列表
needToEslintPathList = []

# 如果参数是目录，末尾带星，则提取目录下所有文件
if file_list_str[-1] == '*':
    dirct = file_list_str[:-1]
    for i in os.listdir(dirct):
        fulldirct = os.path.join(dirct, i)
        needToEslintPathList.append(fulldirct)
        if os.path.isdir(fulldirct):  # 入参需要是绝对路径
            print(i)
else:  # 如果是文件路径列表，直接将字符串转化为数组
    needToEslintPathList = json.loads(file_list_str)

# print(needToEslintPathList)

# 配置文件
config_file_path = os.getenv('JIANMU_CONFIG_PATH')

# 指定配置文件缺省值
if not config_file_path:
    config_file_path = '.eslintrc.js'


# 执行命令，并打印检测结果的函数
def print_error(cmd):
    result = os.popen(cmd)
    # 返回的结果是一个<class 'os._wrap_close'>对象，需要读取后才能处理
    # context = result._stream.buffer.read()
    context = result.read()
    # try:
    #     context.decode().strip()
    # except UnicodeDecodeError:
    #     context.decode('gbk').strip()

    ret = len(context.splitlines())
    # 不报错，无输出，不打印
    if ret == 0:
        return ret
    # 有错误输出，打印
    for line in context.splitlines():
        print(line)
    return ret


print("=============================eslint检测/格式化=============================\n")

# 文件总数
file_total = len(needToEslintPathList)
# 检测出存在错误的文件数
file_error = 0
# 已自动修复全部错误的文件数
file_fixed = 0
# 检测出存在错误的文件数
file_need_fixed_byhand = 0


for code_file in needToEslintPathList:
    print("-----------------------------------------------------------------------")
    print("检测文件："+str(code_file))
    if not os.path.exists(code_file):
        print("文件不存在！\n")
        file_total = file_total-1
        continue

    print("检测结果：")

    # 检查错误
    check_shell = f'eslint -c {config_file_path} {code_file}'
    # print_error返回值： 0：eslint不报错，程序无错误，无输出，完美运行，否则，返回cmd输出行数
    ret = print_error(check_shell)
    if ret == 0:
        print("--wow，nice！未检测到错误!")
    else:
        file_error = file_error+1
        print("\n--已完成自动修复/格式化，剩余错误（需手动修改）：\n")
        # 修复错误
        fix_shell = f'eslint -c {config_file_path} --fix {code_file}'
        ret2 = print_error(fix_shell)
        # 还有需要手动修复的文件，计数
        if ret2 != 0:
            file_need_fixed_byhand = file_need_fixed_byhand+1
        else:
            print("已自动修复所有错误！")
            file_fixed = file_fixed+1

    print('\n')

# 输出结果文件
res = {
    "file_total": file_total,
    "file_error": file_error,
    "file_fixed": file_fixed,
    "file_need_fixed_byhand": file_need_fixed_byhand
}

resJSON = json.dumps(res)
resJSON2 = json.dumps(res, sort_keys=True, indent=4, separators=(',', ': '))
print(resJSON)
with open("resultFile", "w") as file:
    file.write(resJSON)
    file.close()

print("\n=========================================END==========================================")
